从视频中提取PPT,并转为PDF
今天推荐一款 Python 开发的的开源软件,video2pdfslides[1], 它的主要作用就是从一个视频里提取有效图片, 去重后并转为 PDF。
安装与运行
git clone https://github.com/kaushikj/video2pdfslides
cd video2pdfslides
pip install -r requirements.txt
python video2pdfslides.py <video_path>
分解步骤(代码解读)
图片抽取
def get_frames(video_path):
使用 opencv_python
来读取视频,并抽取每一帧(实际上并不需要抽取每一帧,可以设置一个 FRAME_RATE,实现每隔几帧抽取一帧)
图片去重
def detect_unique_screenshots(video_path, output_folder_screenshot_path):
使用 opencv_python
的背景提取算法来去重,
FGBG_HISTORY = FRAME_RATE * 15 # no.of frames in background object
VAR_THRESHOLD = 16 # Threshold on the squared Mahalanobis distance between the pixel and the model to decide whether a pixel is well described by the background model.
DETECT_SHADOWS = False # If true, the algorithm will detect shadows and mark them.
fgbg = cv2.createBackgroundSubtractorMOG2(
history=FGBG_HISTORY,
varThreshold=VAR_THRESHOLD,
detectShadows=DETECT_SHADOWS)
history:用于训练背景的帧数,默认帧数为 500 帧,如果不动手设置 learingRate,history 就被用于计算当前的 learningRate, 此时 history 越大,learningRate 越小,背景更新越慢 varThreshold:方差阈值,用于判断当前像素是前景还是背景。一般默认为 16,如果光照变化明显,如阳光下的水面,建议设为 25,值越大灵敏度越低 detectShadows:是否检测影子,设为 True 为检测,False 为不检测,检测影子会增加程序时间复杂度,一般设置为 False
OpenCV 中支持的两种背景提取算法都是基于模型密度评估,然后在像素级对图像进行前景与背景分类的方法,它们具有相同的假设前提 – 各个像素之间是没有相关性的,跟它们算法思想不同的方法主要是基于马尔可夫随机场理论,认为每个像素跟周围的像素是有相关性关系,但是基于马尔可夫随机场的方法速度与执行效率都堪忧!所以 OpenCV 中没有实现。
背景减法是一种技术,它对给定视频中的背景进行建模,然后使用该模型来检测运动对象。该技术在视频压缩和视频监视中大量使用。在必须检测静态场景中的移动物体的情况下,它的表现很好。该算法的基本原理是检测背景,为其建立模型,然后从当前帧中减去背景以获得前景。该前景对应于移动的对象。
这里的主要步骤之一是建立背景的模型。它与帧差分不同,因为我们不差分连续帧。我们正在对背景进行建模并实时更新,这使其成为一种自适应算法,可以适应不断变化的基线。因此,它的表现要比帧差分好得多。
图片转 PDF
def convert_screenshots_to_pdf(output_folder_screenshot_path):
使用 img2pdf
包来把提前的图片转为 PDF
在转 PDF 之前,程序运行手工去除不想要的图片。
测试
昨天我用它处理一个 接近 47 分钟 的演讲视频(100M, mp4 格式),用时接近 19 分钟,最终生成 65 张截图
参考资料
video2pdfslides: https://github.com/kaushikj/video2pdfslides